package com.example.indenture.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ResourceUtils;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author gzp
 * @create 2023-02-15 20:41
 * 具体功能如下：
 *
 * 该类使用@Configuration注解表示这是一个配置类。
 * @AutoConfigureAfter(WebMvcAutoConfiguration.class)注解表示该配置类在WebMvcAutoConfiguration类之后自动配置。
 * WebMvcConfigurer接口是Spring MVC的配置接口，通过实现该接口可以自定义Web MVC的配置。
 * addResourceHandlers(ResourceHandlerRegistry registry)方法用于配置静态资源的处理器和位置。根据操作系统类型，将静态资源路径映射到对应的本地路径。
 * addCorsMappings(CorsRegistry registry)方法用于配置跨域资源共享（CORS）支持。通过调用registry.addMapping("/**")来添加CORS映射规则，允许所有来源的请求（allowedOrigins("*")），允许的HTTP方法（POST、GET、PUT、OPTIONS、DELETE），设置最大缓存时间（maxAge(3600)），以及允许的来源模式（allowedOriginPatterns("*")）。
 * 总体而言，该配置类主要用于配置静态资源处理和CORS支持。静态资源处理器用于将URL映射到对应的本地资源路径，以便在Web应用程序中提供静态资源。CORS支持允许不同域的客户端发起跨域请求。
 */
@Configuration
@AutoConfigureAfter(value = {WebMvcAutoConfiguration.class})
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private ResourceBean resourceBean;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        String os = System.getProperty("os.name");
        if (os.toLowerCase().startsWith("win")) {
            registry.addResourceHandler(resourceBean.getPathPattern())
                    .addResourceLocations(
                            ResourceUtils.FILE_URL_PREFIX + resourceBean.getWindowLocalPath());
        } else {
            registry.addResourceHandler(resourceBean.getPathPattern())
                    .addResourceLocations(
                            ResourceUtils.FILE_URL_PREFIX + resourceBean.getLinuxLocalPath());
        }
    }

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
                .maxAge(3600)
                .allowedOriginPatterns("*");
    }
}
